#pragma once

#include <string>
#include "glad/glad.h"
#include "GLFW/glfw3.h"
#include "glm/glm.hpp"
#include "glm/gtc/type_ptr.hpp"

namespace Alice
{

/* 
    着色器类
*/ 
class Shader
{
public:
    // 着色器程序 ID
    unsigned int Id;

    /* 
        激活着色器
    */ 
    Shader& Use();

    /* 
        编译顶点着色器与片段着色器的源码
        \param vertex_source    // 顶点着色器源码字符串
        \param fragment_source  // 片段着色器源码字符串
        \param geometry_source  // 几何着色器源码字符串，这是一个可选参数
    */ 
    void Compile(
        const char* vertex_source, 
        const char* fragment_source,
        const char* geometry_source
    );

    /* 
        设置着色器中的 uniform 属性
        \param name         // 属性名
        \param value        // 设置的目标值
        \param use_shader   // 是否激活着色器
    */  
    void SetFloat(const char* name, float value, bool use_shader = false);
    void SetInt(const char* name, int value, bool use_shader = false);
    void SetVec2f(const char* name, float x, float y, bool use_shader = false);
    void SetVec2f(const char* name, const glm::vec2& value, bool use_shader = false);
    void SetVec3f(const char* name, float x, float y, float z, bool use_shader = false);
    void SetVec3f(const char* name, const glm::vec3& value, bool use_shader = false);
    void SetVec4f(const char* name, float x, float y, float z, float w, bool use_shader = false);
    void SetVec4f(const char* name, const glm::vec4& value, bool use_shader = false);
    void SetMat44(const char* name, const glm::mat4& value, bool use_shader = false);

private:
    // 检查着色器是否编译并且链接通过
    void CheckCompileErrors(unsigned int object, std::string type);
};


} // namespace Alice

